#include "m1cmd.h"

/*
**************************************************************************************************************
*
* 函数原型：APP_M1Card_Hook_AuthBlkKey
*
* 函数功能：校验密码
*
* 函数输入：Mode		模式  PICC_KEYA,PICC_KEYB
*			Block  		物理块号
*			pKey 		6字节的密码
*
* 函数输出：
*
* 函数返回：0			成功
*			其它		失败
*   
**************************************************************************************************************
*/
U32 APP_M1Card_Hook_AuthBlkKey( U08 Mode, U08 Block, U08 *pKey )
{
	U32 rcode;								//13.56
	
	rcode = ICC_MiOne_LoadKey( pKey );
	if( rcode != 0 )
	{ return rcode; }
	
	rcode = ICC_MiOne_CheckKey( Mode, gM1CardSN, Block );
	if( rcode != 0 )
	{ return 13130; }		

	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：APP_M1Card_Hook_BlkRead
*
* 函数功能：块读
*
* 函数输入：Mode		模式  OLNY_REQUST,OLNY_AUTH,NO_REQUST_AUTH,OLNY_REQUST_B,OLNY_AUTH_B,NO_REQUST_AUTH_B
*			Block  		物理块号
*			pKey 		6字节的密码
*
* 函数输出：pBuffer		获取到的16字节数据
*
* 函数返回：0			成功
*			其它		失败
*   
**************************************************************************************************************
*/
U32 APP_M1Card_Hook_BlkRead( U08 Mode, U08 Block, U08 *pBuffer, U08 *pKey )
{
	U32 rcode;					 									//13.56
	
	if( ( Mode == OLNY_REQUST ) || ( Mode == OLNY_AUTH ) )			//校验密码A
	{
		rcode = ICC_MiOne_BlkRead( Block,PICC_KEYA, pKey,gM1CardSN, pBuffer );		
	}	
	else if( ( Mode == OLNY_REQUST_B ) || ( Mode == OLNY_AUTH_B ) )	//校验密码B	
	{
		rcode = ICC_MiOne_BlkRead( Block,PICC_KEYB, pKey,gM1CardSN, pBuffer );			
	}
	else 
	{
		rcode = ICC_MiOne_BlkRead( Block,PICC_NULL, pKey,gM1CardSN, pBuffer );	
	}

	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：APP_M1Card_Hook_BlkWrite
*
* 函数功能：块写
*
* 函数输入：Mode		模式  OLNY_REQUST,OLNY_AUTH,NO_REQUST_AUTH,OLNY_REQUST_B,OLNY_AUTH_B,NO_REQUST_AUTH_B
*			Block  		物理块号
*			pKey 		6字节的密码
*			pBuffer		写入的16字节数据
*
* 函数输出：
*
* 函数返回：0			成功
*			其它		失败
*   
**************************************************************************************************************
*/
U32 APP_M1Card_Hook_BlkWrite( U08 Mode, U08 Block, U08 *pBuffer, U08 *pKey )
{
	U32 rcode;
	
	if( ( Mode == OLNY_REQUST ) || ( Mode == OLNY_AUTH ) )			//校验密码A
	{
		rcode = ICC_MiOne_BlkWrite( Block,PICC_KEYA, pKey,gM1CardSN, pBuffer );					//写入数据	
	}	
	else if( ( Mode == OLNY_REQUST_B ) || ( Mode == OLNY_AUTH_B ) )	//校验密码B	
	{
		rcode = ICC_MiOne_BlkWrite( Block,PICC_KEYB, pKey,gM1CardSN, pBuffer );					//写入数据			
	}
	else 
	{
		rcode = ICC_MiOne_BlkWrite( Block,PICC_NULL, pKey,gM1CardSN, pBuffer );	
	}
	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：加值，减值，传输
*
* 函数功能：块写
*
* 函数输入：cmd			命令  PICC_ADD,	PICC_SUB, PICC_RESTORE
*			Block  		物理块号主块
*			Value 		16字节的密包数据
*			TranBlock	目标块
*
* 函数输出：
*
* 函数返回：0			成功
*			其它		失败
*   
**************************************************************************************************************
*/
U32 APP_M1Card_Hook_Value( U08 cmd, U08 Block, U08 *Value, U08 TranBlock )
{
	U32 rcode;								 			//13.56
	
	rcode = ICC_MiOne_Value( cmd, Block, Value, TranBlock );		
	
	return rcode;
}

/*
**************************************************************************************************************
*
* 函数原型：U32 M1Card_Hook_7816APDU( U08 *in, U32 inlen, U08 *out, U32 *outLen, U32 maxsize )
*
* 函数功能：7816数据交互
*
* 函数输入：in			传输给卡片数据
*			inlen		传输给卡片数据
*			maxsize		接收数据缓冲区大小
*
* 函数输出：out 		接收到的数据
*			outLen 		接收到的数据长度
*
* 函数返回：0			成功
*			其它		失败
*   
**************************************************************************************************************
*/
U32 M1Card_Hook_7816APDU( U08 *in, U32 inlen, U08 *out, U32 *outLen, U32 maxsize )
{
	U32 rcode;
	rcode = ICC_APDU_Exchange( Gich_Sam, in, inlen, out, outLen, maxsize );
	return rcode;
}



